import { defineStore } from 'pinia';
import { watch } from 'vue';
import { mitt, getSystemConfig, trim, setupWebSocket, ReceiveMessageEnum } from '@jecloud/utils';
import { getAjaxBaseURL, SYSTEM_PARAM_DEVICE } from '@/service/helper';
/**
 * websocket
 */
export const useWebSocketStore = defineStore({
  id: 'websocket-store',
  state: () => {
    return {
      cid: '', // 设备推送ID
      emitter: mitt(), // 事件管理器
      message: null, // 最新消息
      websocket: null, // socket实例
      disabled: false, // 禁用
      debug: true, //调试
      watchs: [], // 脚本监听函数
    };
  },
  actions: {
    /**
     * 绑定事件
     * @param args
     */
    on(...args) {
      this.emitter.on(...args);
    },
    /**
     * 触发事件
     * @param args
     */
    emit(...args) {
      return this.emitter.emit(...args);
    },
    /**
     * 安装websocket
     */
    setupWebSocket() {
      if (!this.disabled) {
        this.websocket = setupWebSocket({
          url: this.getWebSocketUrl(),
          cid: this.cid,
          device: SYSTEM_PARAM_DEVICE,
          debugger: false,
          onMessage: this.onMessage,
        });
      }
    },
    /**
     * 获取websocket配置地址
     * @returns url
     */
    getWebSocketUrl() {
      return trim(getSystemConfig('JE_CORE_WEBSOCKETURL')) || getWebSocketDefaultUrl();
    },
    /**
     * 是否连接状态
     * @returns
     */
    isConnected() {
      return this.websocket?.isConnected();
    },
    /**
     * 设置设备推送ID
     * @param {*} cid
     */
    setCid(cid) {
      this.cid = cid;
    },
    /**
     * 登录
     */
    login() {
      this.websocket?.close();
      this.websocket?.connect(this.getWebSocketUrl());
    },
    /**
     * 退出
     */
    logout() {
      this.websocket?.close();
      // 清空监听事件
      this.emitter.clear();
      // 清空监听函数
      this.watchs.forEach((fn) => {
        fn?.();
      });
      this.watchs = [];
    },
    /**
     * 接收事件
     * @param {*} message
     */
    onMessage(message) {
      const { type } = message;
      switch (type) {
        case ReceiveMessageEnum.SYS_MESSAGE: // 系统业务消息，业务使用
          this.message = message;
          this.emit('message', message);
          break;
        case ReceiveMessageEnum.NOTICE_MESSAGE: // 通知消息，系统级别使用
          this.emit('notice', message);
          break;
      }
    },
    /**
     * 添加监听事件，脚本中使用
     * @param {*} watchFn
     */
    addWatch(watchFn) {
      const fn = watch(() => this.message, watchFn);
      this.watchs.push(fn);
      return fn;
    },
  },
});
/**
 * 获取websocket默认url
 * @returns
 */
function getWebSocketDefaultUrl() {
  let url = '';
  let wsPrefix = 'ws';

  // #ifdef H5
  wsPrefix = window.location.href.startsWith('https') ? 'wss' : wsPrefix;
  url = `${wsPrefix}://${window.location.host}/jesocket`; // socket链接
  // #endif
  // #ifndef H5
  wsPrefix = getAjaxBaseURL()?.startsWith('https') ? 'wss' : wsPrefix;
  const baseURL = getAjaxBaseURL()
    .replace(/(^http(s)?:\/\/)/, '')
    .replace('/', '');
  url = `${wsPrefix}://${baseURL}/jesocket`; // socket链接
  // #endif
  return url;
}
